<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>JS变量作用域与作用域链</title>
</head>
<body>
    <h1>JS变量作用域与作用域链</h1>
    <hr>

    <script>
        function demo(){
            // 局部变量
            var J = '蜘蛛侠';
            console.log('在函数内部使用局部变量',+J);
        }
        demo();
        // console.log('在函数外部使用局部变量: ' + J); // 局部变量只能在内部使用

        // 全局变量
        var A = 'MJ';
        console.log('在函数外部使用全局变量: ' + A);

        function test(){
        console.log('在函数内部使用全局变量: ' + A);   // 不同于PHP 他能在内部使用全局变量;

        }
        test();


        // 在局部声明全局变量,
        function sum(){
            K = '食客';   // 不需要 var 符 直接 写变量 就是 全局变量了

        }
        sum();
        console.log('在函数外部使用,在内部定义的 全局变量: ' + K);


        var a = '全局的A';
        function fun1(){
            console.log('a:' ,  a);
        }
        // fun1();
        function fun2(){
            var a = '局部的A';
            // a = 'asdasda';
            fun1();
        }
        fun2();

        // 以上的运行顺序 先是执行 fun2 -> fun1  因为在fun1中 a 在局部没有被定义 所以 只能去上一层去找(去全局找) 找到了 定义好的 全局A ;
        // 1. 在此之间 作用域是在定义的时候决定的不是在 调用的时候决定
        // 2. 如果找不到对应的作用域下的变量 那么他会向上一层查询 如果全局还没有 就报错 (先局部->上一层全局) 并不是运行顺序 是 局部到全局的顺序
        


    </script>
    
    

</body>
</html>